home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Popular Request
/
By Popular Request (Arsenal Computer)(SysOptics Distribution System).ISO
/
amiga1
/
butclas3.lha
/
ProgressClass.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-04
|
7KB
|
310 lines
#include "headers.h"
#include "buttonclass.h"
#define FLAG_SHOWPERCENT 1
struct ProgressData {
UWORD min;
UWORD max;
UWORD current;
UWORD flags;
struct TextFont *textFont;
};
struct ClassGlobalData {
struct Library *SysBase;
struct Library *IntuitionBase;
struct Library *UtilityBase;
struct Library *GfxBase;
};
typedef struct ClassGlobalData CGLOB;
#define D(x) ;
#define REG(x) register __ ## x
extern ULONG __stdargs DoSuperMethodA( struct IClass *cl, Object *obj, Msg message );
extern ULONG DoMethod( Object *obj, unsigned long MethodID, ... );
static ULONG __asm dispatchProgressGadget(REG(a0) Class *cl, REG(a2) Object *o, REG(a1) Msg msg);
static ULONG RenderProgress(CGLOB *z, Class *cl, struct Gadget *g, struct gpRender *msg, struct ProgressData *inst);
static void SPrintf(struct Library *SysBase, STRPTR buffer, STRPTR format, ...);
#define IntuitionBase z->IntuitionBase
#define UtilityBase z->UtilityBase
#define GfxBase z->GfxBase
Class *initProgressGadgetClass(struct Library *IBase, struct Library *UBase, struct Library *GBase)
{
Class *cl;
CGLOB *z;
struct Library *SysBase= *((void **)4L);
z= AllocVec(sizeof(CGLOB), MEMF_CLEAR);
if( z )
{
z->SysBase = SysBase;
IntuitionBase= IBase;
UtilityBase = UBase;
GfxBase = GBase;
if( cl = MakeClass( NULL, "gadgetclass", NULL, sizeof(struct ProgressData), 0) )
{
cl->cl_Dispatcher.h_Entry = (ULONG(*)()) dispatchProgressGadget;
cl->cl_Dispatcher.h_Data = z;
return(cl);
}
FreeVec(z);
}
return(NULL);
}
#define SysBase z->SysBase
BOOL freeProgressGadgetClass( Class *cl )
{
CGLOB *z= cl->cl_Dispatcher.h_Data;
BOOL retval;
retval= FreeClass(cl);
FreeVec(z);
return( retval );
}
static ULONG __asm dispatchProgressGadget(REG(a0) Class *cl, REG(a2) Object *o, REG(a1) Msg msg)
{
CGLOB *z= cl->cl_Dispatcher.h_Data;
struct Gadget *g= (struct Gadget *)o;
struct RastPort *rp;
struct ProgressData *inst;
struct TagItem *ti;
struct opGet *opget;
ULONG retval;
Object *object;
switch( msg->MethodID )
{
case OM_NEW:
D( kprintf("OM_NEW\n"); )
if( object = (Object *)DoSuperMethodA(cl, o, msg) )
{
ti= ((struct opSet *)msg)->ops_AttrList;
inst= INST_DATA(cl, object);
inst->min = GetTagData(PRO_Min, 0, ti);
inst->max = GetTagData(PRO_Max, 100, ti);
inst->current = GetTagData(PRO_Current, 0, ti);
inst->flags = (GetTagData(PRO_ShowPercent, 0, ti) ? FLAG_SHOWPERCENT : 0);
inst->textFont= (struct TextFont *)GetTagData(PRO_TextFont, 0, ti);
}
retval= (ULONG)object;
break;
case GM_RENDER:
D( kprintf("GM_RENDER\n"); )
inst= INST_DATA(cl, o);
retval= RenderProgress(z, cl, g, (struct gpRender *)msg, inst);
break;
case OM_SET:
D( kprintf("OM_SET\n"); )
ti= ((struct opSet *)msg)->ops_AttrList;
if( FindTagItem(GA_Width, ti) ||
FindTagItem(GA_Height, ti) ||
FindTagItem(GA_Top, ti) ||
FindTagItem(GA_Left, ti) ||
FindTagItem(PRO_Min, ti) ||
FindTagItem(PRO_Max, ti) ||
FindTagItem(PRO_Current, ti) ||
FindTagItem(PRO_ShowPercent, ti) ||
FindTagItem(PRO_TextFont, ti) )
{
WORD x,y,w,h;
x= g->LeftEdge;
y= g->TopEdge;
w= g->Width;
h= g->Height;
retval= DoSuperMethodA(cl, o, msg);
if( rp=ObtainGIRPort( ((struct opSet *)msg)->ops_GInfo) )
{
UWORD *pens= ((struct opSet *)msg)->ops_GInfo->gi_DrInfo->dri_Pens;
struct TagItem *tmp;
if( x!=g->LeftEdge || y!=g->TopEdge || w!=g->Width || h!=g->Height )
{
SetAPen(rp, pens[BACKGROUNDPEN]);
SetDrMd(rp, JAM1);
RectFill(rp, x, y, x+w, y+h);
}
inst= INST_DATA(cl, o);
inst->min = GetTagData(PRO_Min, (LONG)inst->min, ti);
inst->max = GetTagData(PRO_Max, (LONG)inst->max, ti);
inst->current = GetTagData(PRO_Current, (LONG)inst->current, ti);
inst->textFont= (struct TextFont *)GetTagData(PRO_TextFont, (LONG)inst->textFont, ti);
if( tmp=FindTagItem(PRO_ShowPercent, ti) )
{
inst->flags = ( tmp->ti_Data ? FLAG_SHOWPERCENT : 0);
}
DoMethod(o, GM_RENDER, ((struct opSet *)msg)->ops_GInfo, rp, GREDRAW_REDRAW);
ReleaseGIRPort(rp);
}
}
else
{
retval= DoSuperMethodA(cl, o, msg);
}
break;
case OM_GET:
D( kprintf("OM_GET\n"); )
opget= (struct opGet *)msg;
inst= INST_DATA(cl, o);
retval= TRUE;
switch( opget->opg_AttrID )
{
case PRO_Current:
*(opget->opg_Storage)= (ULONG)inst->current;
break;
case PRO_Min:
*(opget->opg_Storage)= (ULONG)inst->min;
break;
case PRO_Max:
*(opget->opg_Storage)= (ULONG)inst->max;
break;
case PRO_ShowPercent:
*(opget->opg_Storage)= (ULONG)( inst->flags & FLAG_SHOWPERCENT );
break;
case PRO_TextFont:
*(opget->opg_Storage)= (ULONG)inst->textFont;
break;
default:
retval= DoSuperMethodA(cl, o, msg);
}
break;
case GM_HITTEST:
case GM_GOACTIVE:
case GM_HANDLEINPUT:
case GM_GOINACTIVE:
default:
D( kprintf("DEFAULT\n"); )
retval= DoSuperMethodA(cl, o ,msg);
break;
}
return( retval );
}
static ULONG RenderProgress(CGLOB *z, Class *cl, struct Gadget *g, struct gpRender *msg, struct ProgressData *inst)
{
struct RastPort *rp;
ULONG retval=TRUE;
UWORD *pens= msg->gpr_GInfo->gi_DrInfo->dri_Pens;
if( msg->MethodID == GM_RENDER )
{
rp= msg->gpr_RPort;
}
else
{
rp= ObtainGIRPort(msg->gpr_GInfo);
}
if( rp )
{
UBYTE shine, shadow, sel, back;
UWORD x, y, w, h;
UBYTE oldAPen, oldDrMd;
LONG pos, min, max;
oldAPen= rp->FgPen;
oldDrMd= rp->DrawMode;
back = pens[BACKGROUNDPEN];
sel = pens[FILLPEN];
shine = pens[SHADOWPEN];
shadow= pens[SHINEPEN];
x= g->LeftEdge;
y= g->TopEdge;
w= g->Width-1;
h= g->Height-1;
pos= (LONG)inst->current;
min= (LONG)inst->min;
max= (LONG)inst->max;
if( pos < min )
{
pos = min;
}
if( pos > max )
{
pos = max;
}
pos = (pos - min) * (LONG)(w) / (max - min);
//SetDrMd(rp, JAM1);
if( pos > 0 )
{
SetAPen(rp, sel);
RectFill( rp, x+2, y+1, x+pos-2, y+h-1 );
}
if( pos < w )
{
SetAPen(rp, back);
RectFill( rp, x+pos+2, y+1, x+w-2, y+h-1 );
}
SetAPen(rp, shadow);
RectFill(rp, x+1, y+h, x+w, y+h);
RectFill(rp, x+w-1, y+1, x+w-1, y+h);
RectFill(rp, x+w, y, x+w, y+h);
SetAPen(rp, shine);
RectFill(rp, x, y, x+w-1, y);
RectFill(rp, x, y+1, x, y+h);
RectFill(rp, x+1, y+1, x+1, y+h-1);
if( inst->flags & FLAG_SHOWPERCENT )
{
UBYTE per[5];
UWORD slen, text_x, text_y;
struct TextExtent te;
SPrintf(SysBase, per, "%ld%%", (w ? pos*100/w : 0 ));
slen= strlen(per);
TextExtent(rp, per, slen, &te);
text_x= x + (w+1)/2 - te.te_Width/2;
text_y= y + (h+1)/2 - (te.te_Extent.MaxY - te.te_Extent.MinY + 1)/2 - te.te_Extent.MinY;
if( inst->textFont ) SetFont(rp, inst->textFont);
SetAPen(rp, pens[TEXTPEN]);
Move(rp, text_x, text_y);
Text(rp, per, slen);
}
SetAPen(rp, oldAPen);
SetDrMd(rp, oldDrMd);
if( msg->MethodID != GM_RENDER )
{
ReleaseGIRPort(rp);
}
}
else
{
retval= FALSE;
}
return( retval );
}
#undef SysBase
static void SPrintf(struct Library *SysBase, STRPTR buffer, STRPTR format, ...)
{
RawDoFmt( format, (APTR)(&format+1), (void (*)())"\x16\xc0\x4E\x75", buffer);
}